package com.aaa.qy127.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.*;

public class JDBCUtil {
    /*public static String DRIVER;
    public static String URL;
    public static String USER;
    public static String PASSWORD;*/

    /**
     * 加载驱动
     */
    public static DataSource dataSource = null;
    static{
        /*try {
            //创建一个输入流
            InputStream stream = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            //创建一个Properties 对象
            Properties p = new Properties();
            p.load(stream);

            DRIVER = (String)p.get("driver");
            URL = (String)p.get("url");
            USER = (String)p.get("user");
            PASSWORD = (String)p.get("password");
            Class.forName(DRIVER);
        } catch (ClassNotFoundException | IOException e) {
            e.printStackTrace();
        }*/

        try {
            //创建一个输入流
            InputStream stream = JDBCUtil.class.getClassLoader().getResourceAsStream("druid.properties");
            //创建一个Properties 对象
            Properties p = new Properties();
            p.load(stream);
            dataSource = DruidDataSourceFactory.createDataSource(p);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    /**
     * 创建连接
     * 返回值类型是 Connection
     * 方法名 getConn
     * 无参
     * @return
     */
    public static Connection getConn(){
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 设置 sql语句参数
     * 返回值类型 void
     * 方法名setShuZu
     * 参数列表 PreparedStatement ps, Object... object
     * @param ps
     * @param objects
     */
    public static void setShuZu(PreparedStatement ps,Object... objects){
        if (objects.length >0){
            for (int i = 0; i < objects.length; i++) {
                try {
                    ps.setObject(i+1,objects[i]);
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }
    }

    /**
     * 关闭连接
     * 返回值类型 void
     * 方法名 closeAll
     * 参数列表 ResultSet resultSet,PreparedStatement ps,Connection conn
     */
    public static void closeAll(ResultSet resultSet,PreparedStatement ps,Connection conn){
        try {
            if (resultSet != null){
                resultSet.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (ps != null){
                ps.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }

        try {
            if (conn != null){
                conn.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * List<List>类型 查询</>
     * 返回值类型 List<List></>
     * 方法名queryList
     *参数列表 String sql,Object... object
     */
    public static List<List> queryList(String sql,Object... objects){
        //获取连接
        Connection conn = getConn();
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        ArrayList<List> lists = null;
        try {
            //sql预编译
            ps = conn.prepareStatement(sql);
            //调用setShuZu()方法为sql语句设置参数
            setShuZu(ps,objects);
            //执行sql语句
            resultSet = ps.executeQuery();
            //创建一个List<List>类型的集合 存放每次循环获得的一整条是数据
            lists = new ArrayList<>();
            //遍历 执行语句之后得到的ResultSet 集合
            //因为里面不知道有几条数据 所以遍历要用while
            while (resultSet.next()){
                //创建一个ArrayList 集合 存放通过遍历列数获得的一条数据
                List<Object> list = new ArrayList<>();
                for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
                    list.add(resultSet.getObject(i+1));
                }
                lists.add(list);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(resultSet,ps,conn);
        }
        return lists;
    }

    /**
     * List<Map<String,Object></>></>
     * 返回值类型 List<Map<String,Object>
     * 方法名 queryMap
     * 参数列表 String sql,Object... object
     */
    public static List<Map<String,Object>> queryMap(String sql, Object... objects){
        //获取连接
        Connection conn = getConn();
        PreparedStatement ps = null;
        ResultSet resultSet = null;
        ArrayList<Map<String,Object>> lists = null;
        try {
            //sql预编译
            ps = conn.prepareStatement(sql);
            //调用setShuZu()方法为sql语句设置参数
            setShuZu(ps,objects);
            //执行sql语句
            resultSet = ps.executeQuery();
            //创建一个List<List>类型的集合 存放每次循环获得的一整条是数据
            lists = new ArrayList<>();
            //遍历 执行语句之后得到的ResultSet 集合
            //因为里面不知道有几条数据 所以遍历要用while
            while (resultSet.next()){
                //创建一个HashMap<String, Object> 集合 存放通过遍历列数获得的一条数据
                Map<String, Object> map = new HashMap<>();
                for (int i = 0; i < resultSet.getMetaData().getColumnCount(); i++) {
                    map.put(resultSet.getMetaData().getColumnName(i+1),resultSet.getObject(i+1));
                }
                lists.add(map);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(resultSet,ps,conn);
        }
        return lists;
    }

    /**
     * 封装通用的增删改
     * 返回值类型 int
     * 方法名updates
     * 参数列表 String sql,Object... object
     */
    public static int update(String sql, Object... objects){
        //获取连接
        Connection conn = getConn();
        PreparedStatement ps = null;
        try {
            //sql预编译
            ps = conn.prepareStatement(sql);
            //调用setShuZu()方法为sql语句设置参数
            setShuZu(ps,objects);
            //执行sql语句
            int i = ps.executeUpdate();

            return i;

        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(null,ps,conn);
        }
        return -1;
    }

    /**
     * 封装返回主键的方法
     * 返回值类型 int
     * 方法名 getPrimaryKey
     * 参数列表 String sql,Object... object
     */
    public static int getPrimaryKey(String sql, Object... objects){
        //获取连接
        Connection conn = getConn();
        PreparedStatement ps = null;
        ResultSet keys = null;
        try {
            //sql预编译
            ps = conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
            //调用setShuZu()方法为sql语句设置参数
            setShuZu(ps,objects);
            //执行sql语句
            ps.executeUpdate();
            //获取主键
            keys = ps.getGeneratedKeys();
            if (keys.next()){
                int i = keys.getInt(1);
                return i;
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            closeAll(keys,ps,conn);
        }
        return -1;
    }
}
